/* Includes ------------------------------------------------------------------*/
#include <main.h>

/* Private define-------------------------------------------------------------*/
#define NTC_CHAN  0x04        //NTC传感器输入通道(CHS2、CHS1、CHS0)
/* Private variables----------------------------------------------------------*/
static void ADC_Init();
static uint16_t ADC_Result();
static uint16_t ADC_Filter_Result();
/* Public variables-----------------------------------------------------------*/
ADC_t idata ADC = 
{
  0,
  ADC_Init,
  ADC_Result,
  ADC_Filter_Result
};
/* Private function prototypes------------------------------------------------*/

/*
* @name   ADC_Init
* @brief  ADC初始化
* @param  None
* @retval None   
*/
static void ADC_Init()
{
  //端口1模拟功能配置寄存器
  P1ASF = BIT4;       //将P1.4口设置为模拟功能A/D使用
  //A/D转换控制寄存器   1100 0100
  ADC_CONTR = ADC_POWER|ADC_SPEED_180|NTC_CHAN;
  Public.Delay_ms(2);   //等待ADC电源稳定

  //ADRJ置‘1’，ADC_RES[1:0]存放高2位ADC结果，ADC_RESL[7:0]存放低8位ADC结果
  CLK_DIV |= 0x20;    
}

/*
* @name   ADC_Result
* @brief  ADC转换结果
* @param  None
* @retval 返回ADC转换结果   
*/
static uint16_t ADC_Result()
{
  uint16_t ADC_Result = 0;

  //喂狗
  WatchDog.Feed();

  //清零转换结果
  ADC_RES   = 0;
  ADC_RESL  = 0;
  //启动ADC
  ADC_CONTR |= ADC_START;
  _nop_();               //手册建议添加四个延时，等待ADC转换完成
  _nop_();
  _nop_();
  _nop_();
  
  while(!(ADC_CONTR & ADC_FLAG));   //查询方式等待ADC转换结果
  //清除ADC转换完成标志位
  ADC_CONTR &= (~ADC_FLAG);

  //获取转换结果 ：ADC_RES高2位+ADC_RESL低8位
  ADC_Result = (ADC_RES & 0x03);    //取出ADC_RES[1:0]存放的高2位数据
  ADC_Result <<= 8;                 //左移8位，将取出的2位高位数据放到第9，第10位
  ADC_Result += ADC_RESL;           //加上低8位的数据，组合成一个16位的数据

  return ADC_Result;
}

/*
* @name   ADC_Filter_Result
* @brief  ADC转换滤波后的结果
* @param  None
* @retval 返回ADC转换结果   
*/
static uint16_t ADC_Filter_Result()
{
  //经过滤波算法后返回的结果就会很准确，遵循产品的稳定性原则
  /*循环读取AD值16次后求平均值并返回结果，而这16次里每一次又是8次读取后取的平均值*/
	uint16_t ADC_min,ADC_max,ADC_temp,ADC_result,ADC_return;
  uint8_t i,j;
  
  ADC_return = 0;
  for(i=0;i<16;i++)
  {
    //喂狗
    WatchDog.Feed();
    
    ADC_result = 0;
    ADC_min = ADC_max = ADC.ADC_Result();
    for(j=0;j<8;j++)
    {
      ADC_temp = ADC.ADC_Result();
      if(ADC_temp < ADC_min)
      {
        ADC_result += ADC_min;
        ADC_min = ADC_temp;
      }
      else if(ADC_temp > ADC_max)
      {
        ADC_result += ADC_max;
        ADC_max = ADC_temp;
      }else
      {
        ADC_result += ADC_temp;
      }
    }
    ADC_result /= 8;
    ADC_return += ADC_result;
  }
  ADC_return /= 16;
  return ADC_return;    //返回经过滤波后的采集值
}
/********************************************************
  End Of File
********************************************************/